package com.atguigu.cloud.response;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

/**
 * 统一响应结果
 */
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class ResultData<T> {
    /**
     * 响应数据
     */
    private T data;
    /**
     * 响应状态码
     */
    private Integer code;
    /**
     * 响应消息
     */
    private String message;
    /**
     * 时间戳 - 接口调用时间（方便调试是否为缓存数据）
     */
    private Long timestamp;

    /**
     * 构造方法
     *
     * @param data    数据
     * @param code    状态码
     * @param message 消息
     */
    public ResultData(T data, Integer code, String message) {
        this.data = data;
        this.code = code;
        this.message = message;
        this.timestamp = System.currentTimeMillis();
    }

    /**
     * 通用成功响应
     *
     * @param data 数据
     */
    public static <T> ResultData<T> success(T data) {
        /*
            // 设置 Http Status Code 状态码
            RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
            HttpServletResponse response = ((ServletRequestAttributes) attributes).getResponse();
            response.setStatus(200);
        */
        return new ResultData<>(data, ResponseCodeEnum.RC200.getCode(), ResponseCodeEnum.RC200.getMessage());
    }


    /**
     * 自定义成功响应数据与枚举
     *
     * @param data             数据
     * @param responseCodeEnum 响应码枚举
     */
    public static <T> ResultData<T> success(T data, ResponseCodeEnum responseCodeEnum) {
        return new ResultData<>(data, responseCodeEnum.getCode(), responseCodeEnum.getMessage());
    }

    /**
     * 自定义成功响应
     *
     * @param data    数据
     * @param code    状态码
     * @param message 消息
     */
    public static <T> ResultData<T> success(T data, Integer code, String message) {
        return new ResultData<>(data, code, message);
    }

    /**
     * 自定义成功响应数据与消息
     *
     * @param data    数据
     * @param message 消息
     */
    public static <T> ResultData<T> success(T data, String message) {
        return new ResultData<>(data, ResponseCodeEnum.RC200.getCode(), message);
    }

    /**
     * 通用失败响应
     */
    public static <T> ResultData<T> fail() {
        return new ResultData<>(null, ResponseCodeEnum.RC500.getCode(), ResponseCodeEnum.RC500.getMessage());
    }

    /**
     * 自定义失败响应枚举
     *
     * @param responseCodeEnum 响应码枚举
     */
    public static <T> ResultData<T> fail(ResponseCodeEnum responseCodeEnum) {
        return new ResultData<>(null, responseCodeEnum.getCode(), responseCodeEnum.getMessage());
    }

    /**
     * 自定义失败响应状态码与消息
     *
     * @param code    状态码
     * @param message 消息
     */
    public static <T> ResultData<T> fail(Integer code, String message) {
        return new ResultData<>(null, code, message);
    }

    /**
     * 自定义失败响应消息
     *
     * @param message 消息
     */
    public static <T> ResultData<T> fail(String message) {
        return new ResultData<>(null, ResponseCodeEnum.RC500.getCode(), message);
    }

}
